package juego;

import java.awt.Color;
import java.awt.Dimension;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import paneles.PanelDelFondo;
import paneles.PanelHorizontal;
import paneles.PanelVertical;
import pildoras.PildoraAchicarPaleta;
import pildoras.PildoraAgrandarPaleta;
import pildoras.PildoraPelotitaLenta;
import pildoras.PildoraPelotitaRapida;
import pildoras.PildoraTresBolitas;

import scenes.Nivel;

import com.uqbar.vainilla.DesktopGameLauncher;
import com.uqbar.vainilla.Game;
import com.uqbar.vainilla.events.EventAdapter;
import componentes.Bolita;
import componentes.Ladrillo;
import componentes.LadrilloDoblementeResistente;
import componentes.Paleta;

public class Arkanoid extends Game {

	private static List<Ladrillo> ladrillosSetUp = new LinkedList<Ladrillo>(); // Solo
																				// para
																				// agregar
																				// pildoras
																				// aleatorias

	// ****************************************************************
	// ** STATICS
	// ****************************************************************

	public static void main(String[] args) throws Exception {
		new DesktopGameLauncher(new Arkanoid()).launch();
	}

	@Override
	protected void initializeResources() {
	}

	@Override
	protected void setUpScenes() {
		Nivel scene = new Nivel();
		this.agregarComponentesPrincipales(scene);
		this.crearPaneles(scene);
		this.agregarLadrillos(scene);
		this.setCurrentScene(scene);
		new EventAdapter(this);
	}

	private void agregarLadrillos(Nivel scene) {
		this.crearFila(scene, Color.GREEN, 10);
		this.crearFila(scene, Color.BLUE, 0);
		this.crearFilaDeResistentes(scene, Color.BLACK, 20);
		this.crearFila(scene, Color.RED, 35);
		this.crearFila(scene, Color.YELLOW, 45);
		this.crearPildoras(scene);

	}

	private void crearFilaDeResistentes(Nivel scene, Color color, int fila) {

		for (int i = 0; i < 500; i += 100) {
			Ladrillo actual = new LadrilloDoblementeResistente(color, 50, 10,
					i, fila);
			scene.addLadrillo(actual);
			ladrillosSetUp.add(actual);
		}

	}

	private void crearPildoras(Nivel scene) {

		 PildoraTresBolitas pildorita = new PildoraTresBolitas(Color.MAGENTA,
		 this.dameLadrilloAleatorio());
		 scene.addPildora(pildorita);

		 PildoraAgrandarPaleta pildoraAgrandar = new
		 PildoraAgrandarPaleta(Color.DARK_GRAY, this.dameLadrilloAleatorio());
		 scene.addPildora(pildoraAgrandar);
		 PildoraAchicarPaleta pildoraAchicar = new
		 PildoraAchicarPaleta(Color.RED, this.dameLadrilloAleatorio());
		 scene.addPildora(pildoraAchicar);
		 PildoraPelotitaLenta pildoraPelotitaLenta = new
		 PildoraPelotitaLenta(Color.PINK, this.dameLadrilloAleatorio());
		 scene.addPildora(pildoraPelotitaLenta);
		 PildoraPelotitaRapida pildoraPelotitaRapida = new
		 PildoraPelotitaRapida(Color.BLACK, this.dameLadrilloAleatorio());
		 scene.addPildora(pildoraPelotitaRapida);

	}

	private Ladrillo dameLadrilloAleatorio() {
		double random = new Random().nextDouble() * ladrillosSetUp.size();
		return ladrillosSetUp.get((int)random);
	}

	private void agregarComponentesPrincipales(Nivel scene) {
		scene.addBolita(new Bolita(Color.RED, scene));
		Paleta paleta = new Paleta(230, this.getDisplayHeight() - 50);
		scene.addPaleta(paleta);
	}

	private void crearPaneles(Nivel scene) {
		scene.addPanel(new PanelHorizontal(this.getDisplayWidth(), 0, 0, 0));
		scene.addPanel(new PanelDelFondo(this.getDisplayWidth(), 0, 0, this
				.getDisplayHeight()));
		scene.addPanel(new PanelVertical(0, this.getDisplayHeight(), 0, 0));
		scene.addPanel(new PanelVertical(0, this.getDisplayHeight(), this
				.getDisplayWidth(), 0));
	}

	private void crearFila(Nivel scene, Color color, int fila) {
		for (int i = 0; i < 500; i += 50) {
			Ladrillo actual = new Ladrillo(color, 40, 4, i, fila);
			scene.addLadrillo(actual);
			ladrillosSetUp.add(actual);
		}

	}

	@Override
	public Dimension getDisplaySize() {
		return new Dimension(500, 500);
	}

	@Override
	public String getTitle() {
		return "Arkanoid";
	}
}
